package top.stmo;


import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

/**
 *     -----------------------Servlet 执行流程----------------------------
 *
 *    Servlet 由谁创建？Servlet方法由谁调用？
 *        Servlet由web服务器创建，Servlet方法由web服务器调用
 *
 *    服务器怎么知道Servlet中一定有service方法？
 *      因为我们自定义的Servlet，必须实现Servlet接口并复写其方法，而Servlet接口中有service方法
 *
 *      -----------------------Servlet 生命周期----------------------------
 *
 *      Servlet运行在Servlet容器(web服务器)中，其生命周期由容器来管理，分为4个阶段
 *
 *          加载和实例化：默认情况下，当Servlet第一次被访问时，由容器创建Servlet对象
 *
 *          初始化：在Servlet实例化之后，容器将调用Servlet的init()方法初始化这个对象，
 *                  完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
 *
 *          请求处理：每次请求Servlet时，Servlet容器都会调用Servlet的service()方法对请求进行处理。
 *
 *          服务终止：当需要释放内存或者容器关闭时，容器就会调用Servlet实例的destroy()方法完成资源的释放。
 *                  在destroy()方法调用之后，容器会释放这个Servlet实例，该实例随后会被Java的垃圾收集器所回收
 *
 */
@WebServlet("/test1")
public class ServletTest1 implements Servlet {

    /**
     *      第一次被访问时调用，且只调用一次
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init");
    }

    /**
     *      获取ServletConfig对象
     */
    @Override
    public ServletConfig getServletConfig() {
        System.out.println("getServletConfig");
        return null;
    }

    /**
     *      每次servlet被访问时调用，可多次调用
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse)
            throws ServletException, IOException {
        System.out.println("Servlet被执行");
    }

    /**
     *      获取Servlet信息,获取版权信息等，一般返回null
     */
    @Override
    public String getServletInfo() {
        System.out.println("getServletInfo");
        return null;
    }

    /**
     *      当Servlet被销毁时，调用该方法。在内存释放或服务器关闭时销毁Servlet,只会被调用一次
     */
    @Override
    public void destroy() {
        System.out.println("destroy");
    }

}
